package collections.list;/*
 * Copyright 2020-2030 the original author or authors.
  *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import collections.Collection;
import collections.Iterator;

import java.util.Comparator;
import java.util.Objects;
import java.util.function.UnaryOperator;

/**
 * @author Neil Wang
 * @version 1.0.0
 * @date 2021/6/11 9:44 上午
 */
public interface List<T> extends Collection<T> {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator<T> iterator();

    Object[] toArray();

    <E> E toArray(E e);

    boolean add(T t);

    boolean remove(Object o);

    boolean containsAll(Collection<?> c);

//    boolean addAll(Collection<? extends T> c);

    boolean addAll(int index, Collection<? extends T> c);

    boolean removeAll(Collection<?> c);

    boolean retainAll(Collection<?> c);

    default void replaceAll(UnaryOperator<T> operator) {
        Objects.requireNonNull(operator);
        ListIterator<T> li = this.listIterator();
        while (li.hasNext()) li.set(operator.apply(li.next()));
    }

    default void sort(Comparator<? super T> c) {
        Object[] a = this.toArray();
        Arrays.sort(a,(Comparator) c);
    }

    ListIterator<T> listIterator();
}
